﻿// 204 多重背包2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>


using namespace std;
/*
http://oj.daimayuan.top/course/5/problem/164

有 n种物品要放到一个袋子里，袋子的总容量为 m
，第 i种物品的体积为 vi
，把它放进袋子里会获得 wi 的收益，一共有 li个。
 问如何选择物品，使得在物品的总体积不超过 m的情况下，获得最大的收益？请求出最大收益。

输入格式
第一行两个整数 n,m。

接下来 n行，每行三个整数 vi,wi,li。

输出格式
一个整数，表示答案。

样例输入
5 10
2 1 2
5 8 2
2 4 5
3 9 2
4 3 2
样例输出
26
数据规模
对于所有数据，保证 1≤n,m,vi,wi,li≤2000。
*/

const int N = 20000, M = 2010;
int n, m;
int v[N], w[N];
int f[M];

int main() {
	cin >> n >> m;
	int cnt = 0;
	for (int i = 1; i <= n; i++) {
		int a, b, s;
		cin >> a >> b >> s;
		int k = 1;
		while (k <= s) {
			cnt++;
			v[cnt] = a * k;
			w[cnt] = b * k;
			s -= k;
			k *= 2;
		}
		if (s > 0) {
			cnt++;
			v[cnt] = a * s;
			w[cnt] = b * s;
		}
	}

	n = cnt;
	for (int i = 1; i <= n; i++) {
		for (int j = m; j >= v[i]; j--) {
			f[j] = max(f[j], f[j - v[i]] + w[i]);
		}
	}

	cout << f[m] << endl;

	return 0;
}

